package chap09;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;//服务端试用
        PrintWriter out = null;
        BufferedReader in = null;
        try {
            serverSocket = new ServerSocket(1111);//开始监听1111端口
        } catch (IOException e) {
            System.out.println("could not listen on prot:1111");
            System.exit(1);
        }
        Socket incoming = null;
        while (true) {
            incoming = serverSocket.accept();
            out = new PrintWriter(incoming.getOutputStream(), true);//printwriter 会自动换行
            //将直接留放在字符串的缓存中
            in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));//为什么放两个进去 一个文本 一个内存?
            out.println("hello 如果ok的话");//放入缓存buffered内存
            out.println("输入 bye 就退出");
            out.flush();
            while (true) {
                //只有当用户输入数据的时候才会返回数据内容
                String str = in.readLine();//请求输入内容 readLine()只有在数据流发生异常或者另一端被close()掉时，才会返回null值
                if (str == null) {//如果用户输入内容的内容是空的
                    break;
                } else {
                    out.println("这是服务端输出 echo:" + str);// 把内容放入 printwriter中
                    out.flush();//?为什么printwrier  刷新该流的缓冲？ 为什么要刷新 与 "输出缓冲区里的数据，刷新缓冲区"
                    if (str.trim().equalsIgnoreCase("bye")) break;//如果是bye 就推出内存
                }

            }
        out.close();
        in.close();
        incoming.close();
        serverSocket.close();//一切都要关闭 问题在于 能否用一个适合的反射来适配开启和关闭？
        }

    }
}
